package com.company;

import java.lang.reflect.*;

public class CallFuncDemo
{
    public static void main(String[] args)
    {
        Class clazz=null;
        Constructor c=null;
        try
        {
            //获取一个Class类型的对象 其中包含了Person类的相关信息
            clazz=Class.forName("com.company.Person");
            //输入String.class参数 得到Person类带参数的构造函数
            //String.class是Class类型
            //程序在运行期间，JAVA运行时系统始终为所有对象维护一个被称为运行时的类型标识，
            // 这个信息保存这没个对象所属的类的足迹。虚拟机利用运行时信息选择相应的方法执行。
            //保存这些信息的类就是Class类
            c=clazz.getDeclaredConstructor(String.class);
            //通过这个带参数的构造函数创建一个Person类型的对象
            Person p=(Person)c.newInstance("Peter");
            //通过反射调用类的构造函数来创建对象的方式
            p.saySkill("Java");

            //通过getMethod方法 得到了带参数的saySkill方法的Method类型的对象
            Method method1=clazz.getMethod("saySkill",String.class);
            //通过invoke方法调用sayskill方法 第一个参数是调用对象 第二个参数是传入的参数
            method1.invoke(p,"C#");

            Method method2=clazz.getMethod("addSalary",int.class);
            Object invoke=method2.invoke(p,100);

            System.out.println(invoke);
        }
        catch(ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch(InstantiationException e)
        {
            e.printStackTrace();
        }
        catch(IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch(InvocationTargetException e)
        {
            e.printStackTrace();
        }
        catch(NoSuchMethodException e)
        {
            e.printStackTrace();
        }
    }
}
